/**
 * 注意：使用await的方法必须加上async，不然会报错！！
 */
module.exports = {
  /**
  * 更新数据
  * @param {*} context 会话
  * @param {*} tableName  表名
  * @param {*} filter  新数据
  * @param {*} data  新数据
  * @result  data  返回对象
  */
  async update(context, tableName, filter, data) {
    if (!filter) {
      const msg = "filter不存在，无法更新";
      console.info(msg);
      return { code: -1, msg: msg }
    }
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).updateMany(
      filter,
      { $set: data }
    );
    console.info("updateMany done, result:", result)
    return result;
  },

  
  /**
   * 更新数据
   * @param {*} context 会话
   * @param {*} tableName  表名
   * @param {*} data  新数据
   * @result  data  返回对象
   */
  async updateBy_id(context, tableName, data) {
    const _id = data._id;
    if (!_id) {
      const msg = "data._id不存在，无法更新";
      return { code: -1, msg: msg }
    }
    console.info("data", data);
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).updateMany(
      { _id: _id },
      { $set: data }
    );
    return result;
  },
  /**
   * 查找单条数据
   * @param {*} context 
   * @param {*} tableName 
   * @param {*} filter 
   * @result  返回单条数据或者null
   */
  async findOne(context, tableName, filter) {
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).find(
      filter,
      {
        limit: 1,
      }
    );
    return result.length > 0 ? result[0] : null;
  },
  /**
   * 查找最新的一条数据 [根据create_time]
   * @param {*} content 
   * @param {*} tableName 
   * @param {*} filter 
   */
  async findOneInLastest(context, tableName, filter) {
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).find(
      filter,
      {
        limit: 1,
        sort: {
          create_time: -1
        }
      }
    );
    return result.length > 0 ? result[0] : null;
  },
  /**
   * 查询最新的一条数据
   * @param {*} content 
   * @param {*} tableName 
   * @param {*} filter 
   */
  async findNew(content, tableName, filter) {
    const cloud = content.cloud;
    const result = await cloud.db.collection(tableName).find(
      filter,
      {
        limit: 1,
        sort: {
          create_time: -1
        }
      }
    );

    return result.length > 0 ? result[0] : null;
  },
  /**
   * 查询列表
   * @param {*} context 
   * @param {*} tableName 
   * @param {*} filter 
   * @param {*} options 
   * filter	object	是	-	过滤条件
   * options.projection	object	否	-	查询后过滤的字段
   * options.sort	object	否	-	排序规则, key是field名字，value是1或-1
   * options.skip	number	否	-	跳过的文档数量
   * options.limit	number	否	-	查询的文档数量限
   * @result  返回列表
   */
  async find(context, tableName, filter, options) {
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).find(
      filter,
      options
    );
    console.info("find done,result.length:", result.length);
    return result;
  },
  /**
   * 删除记录
   * @param {*} context 
   * @param {*} tableName 
   * @param {*} filter 
   * @result 返回结果为删除的记录数 返回对象
   */
  async deleteMany(context, tableName, filter) {
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).deleteMany(filter);
    return result;
  },
  /**
   * 插入数据
   * @param {*} data 
   * @result 结果为创建数据的_id
   */
  async insertOne(context, tableName, data) {
    const cloud = context.cloud;
    const result = await cloud.db.collection(tableName).insertOne(data);
    return result;
  },
  /**
   * 修改或者插入
   * @param {*} context 
   * @param {*} tableName 
   * @param {*} data 
   */
  async insertOrUpdate(context, tableName, data) {
    let result = null;
    if (data._id) {
      //修改
      result = await this.updateBy_id(context, tableName, data);
    } else {
      //插入
      result = await this.insertOne(context, tableName, data);
    }

    return result;
  },

}
